import React, { Component } from 'react'

export default class Test extends Component {
  constructor() {
    super()
    // this.num = 0  this是当前组件实例,我们可以随意的往实例上添加属性
    // this.num是组件的私有数据,但是不能称之为状态
    // this.state是组件的私有数据,但是可以称之为状态
    this.state = {
      count: 0,
      msg: 'hello component',
    }
  }
  render() {
    // 注意: render函数中的this,一定是当前组件实例
    console.log('render函数执行了', this.state.count)
    return (
      <div>
        <h3 id="c">{this.state.count}</h3>
        <h3>{this.state.msg}</h3>
        <button
          onClick={() => {
            // 注意: 如果连续多次调用setState.则会合并成一次
            this.setState({
              count: this.state.count + 1,
              msg: 'xxx',
            })
            // this.setState({
            //   count: this.state.count + 2,
            // })
            // this.setState({
            //   count: this.state.count + 3,
            // })

            // 合并之后
            // this.setState({
            //   // count: this.state.count + 1,
            //   msg: 'xxx',
            //   // count: this.state.count + 2,
            //   count: this.state.count + 3,
            // })
            // 上一次的数据修改完毕之后,回调函数会执行
            // this.setState((state) => {
            //   // 回调函数中接收的数据,就是上一次修改完毕之后,最新的state数据
            //   return {
            //     count: state.count + 2,
            //   }
            // })
            // this.setState((state) => {
            //   return {
            //     count: state.count + 3,
            //   }
            // })

            // setState可以传入两个数据,第一次函数是当上一次数据修改完毕之后,但是在页面渲染之前调用. 第二个函数是在数据修改完毕并页面渲染完毕之后调用
            this.setState(
              (state) => {
                console.log('第一个函数的数据:', state.count)
                console.log('第一个函数的真实dom:', c.innerText)
              },
              () => {
                console.log('第二个函数的数据:', this.state.count)
                console.log('第二个函数的真实dom:', c.innerText)
              }
            )
          }}
        >
          +
        </button>
      </div>
    )
  }
}

/*
    伪代码: 
    React.Component = Component
    export default React 
    export Component

*/
